import time
import warnings
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore")

start = time.time()
test = pd.read_csv('./data/dataset.csv')
print("查看dataset.csv的信息:")
test.info()  # 查看dataset.csv的信息

# 查看 stroke与 gender 的关系(会发现都会有分布，没什么明显差异性)
print('\n查看 stroke与 gender 的关系:')
stroke_gender = test['gender'].groupby(test['stroke'])
print(stroke_gender.value_counts().unstack())
stroke_gender.value_counts().unstack().plot(kind='bar', stacked=True)
plt.savefig('./data/img/gender.jpg')
plt.show()

# 查看 stroke与 smoking_status 的关系(会发现都会有分布，没什么明显差异性)
print('\n查看 stroke与 smoking_status 的关系:')
stroke_smoke = test['smoking_status'].groupby(test['stroke'])
print(stroke_smoke.value_counts().unstack())
stroke_smoke.value_counts().unstack().plot(kind='bar', stacked=True)
plt.savefig('./data/img/smoking_status.jpg')
plt.show()

# 查看 stroke与 work_type 的关系(会发现都会有分布，没什么明显差异性)
print('\n查看 stroke与 work_type 的关系:')
stroke_work = test['work_type'].groupby(test['stroke'])
print(stroke_work.value_counts().unstack())
stroke_work.value_counts().unstack().plot(kind='bar', stacked=True)
plt.savefig('./data/img/work_type.jpg')
plt.show()

# 建模构图(由图可得到；第二列的第三个数据，第二列的第四个数据，第二列的第五个数据，和最后一个数据会发现中风跟年龄是最有关系的)
gender = {'Male': 1, 'Female': 0}
ever_married = {'Yes': 1, 'No': 0}
work_type = {'Private': 0, 'Self-employed': 1, 'Govt_job': 2, 'Never_worked': 3, 'children': 4}
Residence_type = {'Urban': 1, 'Rural': 0}
smoking_status = {'Unknown': 0, 'never smoked': 1, 'smokes': 2, 'formerly smoked': 3}
test.gender = test.gender.map(gender)
test.ever_married = test.ever_married.map(ever_married)
test.work_type = test.work_type.map(work_type)
test.Residence_type = test.Residence_type.map(Residence_type)
test.smoking_status = test.smoking_status.map(smoking_status)

# 绘制热力关系图
print('\n正在绘制热力关系图...')
plt.figure(figsize=(14, 12))
sns.heatmap(test.corr(), annot=True)
plt.savefig('./data/img/Thermodynamic.jpg')
plt.show()

# 矩阵散点图
print('正在绘制矩阵散点图...')
pd.plotting.scatter_matrix(test, alpha=0.3, figsize=(14, 8), diagonal='kde')
plt.tight_layout()
plt.savefig('./data/img/scatter.jpg')
plt.show()

# 分析age(箱线图可以知道中风在年龄高位时最为分布)
print('正在绘制 age 与 stroke 箱线图...')
fig, ax = plt.subplots(1, 2, figsize=(15, 4))
test['age'].hist(bins=100, ax=ax[0])
test.boxplot(column='age', by='hypertension', showfliers=False, ax=ax[1])

# age 各年龄分布
print('正在绘制 age 与 stroke 条形分布图...')
test_age = test[test['age'].notnull()]
plt.figure(figsize=(18, 4))
test_age['age'] = test_age['age'].astype(np.int)
average_age = test_age[['age', 'stroke']].groupby('age', as_index=False).mean()
sns.barplot(x='age', y='stroke', data=average_age, palette='BuPu')
plt.savefig('./data/img/age.jpg')
plt.show()
end = time.time()
print("\n数据可视化完成,用时 {} s".format(round(end - start, 3)))
